package com.opengate.demo.task.sevice.impl;

import com.opengate.base.result.Result;
import com.opengate.demo.contact.feign.DemoFeignService;
import com.opengate.demo.contact.req.GetDemoInfoReq;
import com.opengate.demo.contact.resp.GetDemoInfoResp;
import com.opengate.demo.task.sevice.DemoTaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

/**
 * @author 曳戈泰尔
 * @version 1.0
 * @description 任务实现类
 * @date 2023/4/27 8:59 PM
 */
@Slf4j
@Service
public class DemoTaskServiceImpl implements DemoTaskService {

    private final DemoFeignService demoFeignService;

    @Autowired
    public DemoTaskServiceImpl(DemoFeignService demoFeignService) {
        this.demoFeignService = demoFeignService;
    }

    /** 测试远程调用 */
    @PostConstruct
    public void init() {
        Result<String> result = demoFeignService.test();
        log.info("result:{}", result);

        GetDemoInfoReq getDemoInfoReq = new GetDemoInfoReq().setMobile("12345678901");
        Result<GetDemoInfoResp> result1 = demoFeignService.getDemoInfo(getDemoInfoReq);
        log.info("result:{}", result1);
    }

    /**
     * 每十分钟执行一次
     *
     * <p>fixedDelay：指定任务执行完成后延迟多长时间再执行下一次任务。如果前一次任务执行时间过长，则会影响下一次任务的执行时间。即下一次任务的执行时间为：前一次任务结束时间 +
     * fixedDelay。
     *
     * <p>fixedRate：指定任务执行的频率，即每隔固定时间就执行一次任务。无论上一次任务是否执行完成，都会在指定时间间隔后启动下一次任务。即下一次任务的执行时间为：前一次任务开始时间
     * + fixedRate。
     *
     * <p>因此，如果任务执行时间比较长，建议使用 fixedDelay 参数，以免任务重叠。如果任务执行时间比较短，建议使用 fixedRate 参数，以免任务间隔时间过长。
     */
    @Override
    @Scheduled(fixedRate = 1000 * 60 * 10)
    public String test() {
        log.info("test");

        Result<String> result = demoFeignService.test();
        log.info("result:{}", result);

        GetDemoInfoReq getDemoInfoReq = new GetDemoInfoReq().setMobile("12345678901");
        Result<GetDemoInfoResp> result1 = demoFeignService.getDemoInfo(getDemoInfoReq);
        log.info("result:{}", result1);

        return "test";
    }
}
